﻿using System.Collections.Concurrent;

namespace ConsoleApp;

public class DemoQueue
{
    // 单线程用Queue，多线程用ConcurrentQueue，多线程又要限制元素个数用BlockingCollection。
    public void QueueDemo()
    {
        var messageQueue = new Queue<string>();//创建队列
        messageQueue.Enqueue("Hello");//向队列里添加元素
        messageQueue.Enqueue("World!");

        Console.WriteLine(messageQueue.Dequeue());//从队列里取出元素
        Console.WriteLine(messageQueue.Dequeue());
    }

    public void ConcurrentQueueDemo()
    {
        var concurrentQueue = new ConcurrentQueue<string>();//创建实例
        concurrentQueue.Enqueue("Hello");//向队列里添加元素
        concurrentQueue.Enqueue("World!");

        while(concurrentQueue.TryDequeue(out var message))//cv取出元素
        {
            Console.WriteLine(message);
        }
    }

    //优先队列
    public void PriorityQueueDemo()
    {
        var priorityQueue = new PriorityQueue<string, int>();

        // 向队列中添加元素和对应的优先级
        priorityQueue.Enqueue("任务低", 1);
        priorityQueue.Enqueue("任务高", 3);
        priorityQueue.Enqueue("任务中", 2);

        // 按优先级顺序移除和返回元素
        while (priorityQueue.TryDequeue(out var item, out var priority))
        {
            Console.WriteLine($"处理: {item}, 优先级: {priority}");
        }
    }

    public void BlockingCollectionDemo()
    {
        var blockingCollection = new BlockingCollection<string>(2);//创建队列实例，其中2就是代表着此队列中元素个数的最大值
        blockingCollection.Add("Hello");//添加元素到队列中
        blockingCollection.Add("World!");
        blockingCollection.Add("Good");

        blockingCollection.Add("Evening!");
        blockingCollection.Take();//从队列中取出元素
    }
}